<?php
/**
 * 模型基类
 */
namespace Core;

use \Medoo\Medoo;

/**
 * 数据库模型基类
 * 当PHP 使用PDO访问数据库且脚本需要长时间执行时，频繁会遇见’ MySQL server has gone away’的错误。
 * 分析问题产生原因：因为脚本较长时间未与数据库进行通信，导致数据库连接超时与服务器断开连接导致，这时使用断开的数据库连接操作数据库（CRUD）， 就会产生’ MySQLserver has gone away’的错误提示。
 * 解决之道在于长时间运行的脚本需要与服务器保持心跳，一旦检测到连接断开，则需要重新连接数据库。
 * 20171023 谢宝新
 * http://blog.csdn.net/coprophet/article/details/18364641
 */
class Model extends Medoo
{
    private static $workDb;

	/**
	 * 构造方法
     */
	public function __construct($dbconfig='db')
	{
        parent::__construct(config($dbconfig));
	}


    public static  function init($workid,$dbconfig='db'){
        if(!isset(self::$workDb[$workid]) || self::$workDb[$workid] ==null){
            $conn =new self($dbconfig);
            if(!$conn){
                $conn = null;
                echo "DB Connect ERR:\n";
                return;
            }
//            else{
//                echo "\n --DB connect--:".$workid."\n";
//            }
            self::$workDb[$workid]=$conn;
        }
        return self::$workDb[$workid];
    }



    /**
     * 断线重连检测机制
     * @param $query SQL语句
     * @param array $map  查询条件
     * @return bool|\PDOStatement
     */
    public function exec($query, $map = [])
    {
        try {
            return parent::exec($query, $map);
        }
        catch (\PDOException $e) {
            echo PHP_EOL."+++mysql exec pdo ++++".substr($query,0,50)."……".$e->getMessage().PHP_EOL;

           if ($e->getCode() == '2006'|| $e->getCode() == 'HY000' || stripos($e->getMessage(), 'gone') || stripos($e->getMessage(), 'Lost')) {
               echo "\n reconnect \{{$query}\} \n";
                $this->__construct();
                return parent::exec($query, $map);
            }
            return false;
        }

    }

    /**
     * 重写判断insert数据是否合法，杜绝php array报错
     * @param $table
     * @param $datas
     * @return bool|\PDOStatement
     * Created by: xiebaoxin
     */
    public function insert($table, $datas)
    {
        try {
            if (!isset($datas[ 0 ]))
            {
                $datas = [$datas];
            }
            $newdatas=array();
            foreach ($datas as $data)
            {
                if( !empty($data) && is_array($data)){
                    $newdatas[]=$data;
                }else
                    echo PHP_EOL."sql insert into ".$table." datas erro:";
              /*
               if(!is_array($data)){
                   echo PHP_EOL."sql insert into ".$table." datas erro:";
                   break;
               }*/
            }

            return parent::insert($table, $newdatas);
        }catch(Exception $e) {
            echo PHP_EOL."+++erro:insert {$table} data erro++++".$e->getMessage().PHP_EOL;
        }
    }


}
